"""
联系人类。
至少包含联系人编号，姓名，电话，邮件，头像等属性，以及更新属性，获取属性的方法。
联系人编号可以设计为类变量。
"""
from Head import Head
from UserException import *


class Contact:
    """
    联系人类。
    包含姓名，电话号码，电子邮箱，头像四个实例属性，以及联系人编号、属性集合这些类属性
    针对每个实例属性都有读写的方法，可以提供原子属性名获取属性，有格式化字符串表示。
    """

    # 联系人编号
    __id: int = 0

    # 可供检索或作为排序依据的属性
    atom_attr = ["name", "tel", "email"]

    # 所有实例属性
    all_attr = atom_attr + ["head"]

    def __init__(self, name: str, tel: str, email: str, head: Head = Head("", 0, 0)):
        Contact.__id += 1
        self._name = name
        self._tel = tel
        self._email = email
        self._head = head

    # 实例属性的读写方法
    def get_name(self):
        return self._name

    def set_name(self, value: str):
        self._name = value

    def get_tel(self):
        return self._tel

    def set_tel(self, value: str):
        self._tel = value

    def get_email(self):
        return self._email

    def set_email(self, value: str):
        self._email = value

    def get_head(self):
        return self._head

    def set_head(self, value: Head):
        self._head = value

    # 联系人编号的读取方法
    @property
    def c_id(self):
        return Contact.__id

    #
    def get_attr(self, attr):
        """
        根据输入的属性名读取对应属性

        :return: 若为atom_attr，返回对应值；否则抛出关键字错误
        """
        if attr == "name":
            return self.get_name()
        elif attr == "tel":
            return self.get_tel()
        elif attr == "email":
            return self.get_email()
        else:
            raise KeywordError(1, attr)

    def __str__(self):
        """
        Contact实例的字符串表示

        :return: 格式化的字符串，包含实例属性的信息。
        """
        s = "Name: {}\tTel: {}\tEmail: {}\tHead: {}"\
            .format(self.get_name(), self.get_tel(), self.get_email(), self.get_head())
        return s

    def output(self):
        """
        格式化输出，将实例的字符串表示分行

        :return: 分行表示的实例字符串
        """
        return self.__str__().replace("\t", "\n")
